﻿// --------------------------------------------------------------------------------------------------------------------- 
// <copyright file="Problem8.cs" company="Microsoft">
//   Copyright (c) Microsoft Corporation.  All rights reserved. THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
// </copyright>
// <summary>
//   Defines the Problem8 type.
// </summary>
// ---------------------------------------------------------------------------------------------------------------------
namespace EulerProblemsCSharp.Problems
{
    using System;
    using System.Globalization;
    using System.Linq;

    /// <summary>
    /// Problem 8.
    /// </summary>    
    public class Problem8 : ProblemBase
    {
        /// <summary>
        /// Gets Number.
        /// </summary>
        /// <value>
        /// The number.
        /// </value>
        public override int Number
        {
            get
            {
                return 8;
            }
        }

        /// <summary>
        /// Gets Description.
        /// </summary>
        /// <value>
        /// The description.
        /// </value>
        public override string Description
        {
            get
            {
                return "Find the greatest product of five consecutive digits in the 1000-digit number.";
            }
        }

        /// <summary>
        /// Solves problem 8.
        /// </summary>
        /// <returns>
        /// The solution.
        /// </returns>
        public override object Solve()
        {
            Console.WriteLine();

            var answer = 0;

            var thousandDigitNumber = "73167176531330624919225119674426574742355349194934" 
                                      + "96983520312774506326239578318016984801869478851843" 
                                      + "85861560789112949495459501737958331952853208805511"
                                      + "12540698747158523863050715693290963295227443043557"
                                      + "66896648950445244523161731856403098711121722383113"
                                      + "62229893423380308135336276614282806444486645238749"
                                      + "30358907296290491560440772390713810515859307960866"
                                      + "70172427121883998797908792274921901699720888093776"
                                      + "65727333001053367881220235421809751254540594752243"
                                      + "52584907711670556013604839586446706324415722155397"
                                      + "53697817977846174064955149290862569321978468622482"
                                      + "83972241375657056057490261407972968652414535100474"
                                      + "82166370484403199890008895243450658541227588666881"
                                      + "16427171479924442928230863465674813919123162824586"
                                      + "17866458359124566529476545682848912883142607690042"
                                      + "24219022671055626321111109370544217506941658960408"
                                      + "07198403850962455444362981230987879927244284909188"
                                      + "84580156166097919133875499200524063689912560717606"
                                      + "05886116467109405077541002256983155200055935729725"
                                      + "71636269561882670428252483600823257530420752963450";

            for (var i = 0; i < thousandDigitNumber.Length - 5; i++)
            {
                var product = thousandDigitNumber.Substring(i, 5)
                        .AsEnumerable()
                        .Aggregate(1, (x, y) => x * Convert.ToInt32(y.ToString(CultureInfo.InvariantCulture), CultureInfo.InvariantCulture));

                if (product > answer)
                {
                    answer = product;
                }
            }

            return answer;
        }
    }
}